#include "drivers/ansi.h"

#ifndef __std_out_h_
#define __std_out_h_

void printk(char *fmt, ...);
void display_logo();

#define pr_info(src, fmt, ...)          \
    {                                   \
        save_cursor_color();            \
        set_cursor_color(ANSI_GREEN);   \
        printk("[INFO] [" #src "] ");   \
        printk(fmt, ##__VA_ARGS__);     \
        put_char('\n');                 \
        restore_cursor_color();         \
    }

#define pr_warn(src, fmt, ...)          \
    {                                   \
        save_cursor_color();            \
        set_cursor_color(ANSI_YELLOW);  \
        printk("[WARN] [" #src "] ");   \
        printk(fmt, ##__VA_ARGS__);     \
        put_char('\n');                 \
        restore_cursor_color();         \
    }

#define pr_error(src, fmt, ...)          \
    {                                    \
        save_cursor_color();             \
        set_cursor_color(ANSI_RED);      \
        printk("[ERROR] [" #src "] ");   \
        printk(fmt, ##__VA_ARGS__);      \
        put_char('\n');                  \
        restore_cursor_color();          \
    }

// 不可恢复的 error
#define panic(src, fmt, ...)                    \
    {                                           \
        save_cursor_color();                    \
        set_cursor_color(ANSI_RED);             \
        printk("[FATAL ERROR] [" #src "] ");    \
        printk(fmt, ##__VA_ARGS__);             \
        put_char('\n');                         \
        restore_cursor_color();                 \
        for(;;);                                \
    }

#define pr_debug(src, fmt, ...)          \
    {                                    \
        save_cursor_color();             \
        set_cursor_color(ANSI_BLUE);     \
        printk("[DEBUG] [" #src "] ");   \
        printk(fmt, ##__VA_ARGS__);      \
        put_char('\n');                  \
        restore_cursor_color();          \
    }

#endif
